package cn.lzy.study.datasource.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;

import javax.sql.DataSource;
import java.util.Map;

/**
 * 数据源对象
 * （从配置文件获取数据源值）
 * @author LZY
 * @since 2022-08-10
 */
@ConfigurationProperties(prefix = "spring.datasource")
public class DruidProperties {
    /**
     * 数据池类型
     */
    private String type;
    /**
     * 数据库驱动
     */
    private String driverClassName;
    /**
     * 数据源
     */
    private Map<String, Map<String, String>> ds;
    /**
     * 初始连接数
     */
    private Integer initialSize;
    /**
     * 最小连接池数量
     */
    private Integer minIdle;
    /**
     * 最大连接池数量
     */
    private Integer maxActive;
    /**
     * 配置获取连接等待超时的时间
     */
    private Integer maxWait;


    /**
     * 给数据源初始化数据
     * （在这个方法里，给数据源设置公共属性）
     * @param druidDataSource 数据源，但是这个数据源对象只包含 url、username、password 三个核心属性
     * @return
     */
    public DataSource initDataSource(DruidDataSource druidDataSource) {
        druidDataSource.setInitialSize(this.minIdle);
        druidDataSource.setMinIdle(this.minIdle);
        druidDataSource.setMaxActive(this.maxActive);
        druidDataSource.setMaxWait(this.maxWait);
        return druidDataSource;
    }

    // ====================== Getter & Setter ========================

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getDriverClassName() {
        return driverClassName;
    }

    public void setDriverClassName(String driverClassName) {
        this.driverClassName = driverClassName;
    }

    public Map<String, Map<String, String>> getDs() {
        return ds;
    }

    public void setDs(Map<String, Map<String, String>> ds) {
        this.ds = ds;
    }

    public Integer getInitialSize() {
        return initialSize;
    }

    public void setInitialSize(Integer initialSize) {
        this.initialSize = initialSize;
    }

    public Integer getMinIdle() {
        return minIdle;
    }

    public void setMinIdle(Integer minIdle) {
        this.minIdle = minIdle;
    }

    public Integer getMaxActive() {
        return maxActive;
    }

    public void setMaxActive(Integer maxActive) {
        this.maxActive = maxActive;
    }

    public Integer getMaxWait() {
        return maxWait;
    }

    public void setMaxWait(Integer maxWait) {
        this.maxWait = maxWait;
    }
}
